# -*- coding: latin-1 -*-

import random
import sys
import os
import getopt

#Valores por defecto de los parámetros de entrada
num_pistas = 10
bloques_x_pista = 10
num_proc = 10
tiempo_max = 1000
instxpage = 10
diferencia = 100

def uso():
	print "generate_process_vp.py -p <num_proc> -s <num_pistas>  -b <bloques_x_pista> -t <tiempo_max> -i <inst_por_proc> -d <diferencia>"
	print "Instrucciones:" 
	print "\tEl número de pistas debe ser igual o mayor a 10"
	print "\tEl número de bloques por pista debe ser igual o mayor a 10"	
	print "\tEl número de instrucciones por proceso debe ser al menos una"
	print "\tLa diferencia entre el tiempo de llegada entre las peticiones de un proceso debe ser de al menos un milisegundo"
	print ""
	print "Valores por defecto:"
	print "\tNùmero de pistas: 10"
	print "\tNúmero de procesos: 10"
	print "\tNúmero de bloques por pista: 10"
	print "\tTiempo máximo de llegada del último proceso: 1000 (milisegundos)"
	print "\tMáximo de instrucciones por proceso: 10"
	print "\tMáximo de milisegundos existentes entre el tiempo de llegada de dos instrucciones consecutivas de un proceso: 100"
	exit()


try:
	opts, args = getopt.getopt(sys.argv[1:], "p:s:b:t:i:d:h", ["num_proc=", "num_pistas", "bloques_x_pista=", "tiempo_max=", "inst_por_proc=", "diferencia=", "help"])
except getopt.GetoptError, err:
	print str(err)
	uso()
	exit(2)
for o, a in opts:
	if o in ("-p", "--num_proc"):
		num_proc = a
	elif o in ("-h", "--help"):
		uso()
		exit()
	elif o in ("-s", "--num_pistas"):
		num_pistas = a
	elif o in ("-b", "--bloques_x_pista"):
		bloques_x_pista = a
	elif o in ("-t", "--tiempo_max"):
		tiempo_max = a
	elif o in ("-i", "--inst_por_proc"):
		instxpage = a
	elif o in ("-d", "--diferencia"):
		diferencia = a
	else:
		assert False, "Opción desconocida".encode('latin-1')

#Chequeo los valores mínimos por defecto
if int(bloques_x_pista) < 10 or int(instxpage) <= 0 or int(diferencia) <= 0 or int(num_pistas) < 10:
	uso()
	


f = file("process.xml", "w")

f.write("<Info>\n")

f.write("\t<DiskInfo>\n")
f.write("\t\t<Tracks>" + str(num_pistas) + "</Tracks>\n")
f.write("\t\t<BlocksPerTrack>" + str(bloques_x_pista) + "</BlocksPerTrack>\n")
f.write("\t</DiskInfo>\n")


f.write("\t<ProcessInfo>\n")


for i in range( int(num_proc) ):
	f.write("\t\t<Process>\n")
	f.write("\t\t\t<Id>"+ str(i)  +"</Id>\n")
	number = random.randint(0, 15)
	priority = ""
	if number > 7:
		priority = "BE " + str(15 - number)
	else:
		priority = "RT " + str(number)
	f.write("\t\t\t<Priority>" + priority + "</Priority>\n")
	
	#Guardo el ArrivalTime del proceso para luego usarlo como base del ArrivalTime de sus
	#instrucciones
	arrival = random.randint(0, int(tiempo_max))
	f.write("\t\t\t<ArrivalTime>"+ str(arrival)  +"</ArrivalTime>\n")

	mysize = random.randint( 10, int(bloques_x_pista) * int(num_pistas))
	#f.write("\t\t<DataSize>"+ str(mysize)  +"</DataSize>\n")
	f.write("\t\t<Instructions>\n")

	for j in range( 1, int(instxpage) ):
		f.write("\t\t\t\t<Operation>\n")
		f.write("\t\t\t\t\t<Block>"+ str(random.randint( 0, mysize))  +"</Block>\n")
		f.write("\t\t\t\t\t<InstructionType>"+ random.choice(["READ", "WRITE"])  +"</InstructionType>\n")
		arrival += random.randint(1, int(diferencia))
		f.write("\t\t\t\t\t<ArrivalTimeReq>" + str(arrival) + "</ArrivalTimeReq>\n")
		f.write("\t\t\t\t</Operation>\n")
		
	f.write("\t\t\t</Instructions>\n")
	f.write("\t\t</Process>\n")

f.write("\t</ProcessInfo>\n")

f.write("</Info>\n")



